home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / happy / operate.doc < prev    next >
Encoding:
Text File  |  1993-07-08  |  28.1 KB  |  601 lines

  1. ==============================================================================
  2.  
  3.         HAPPy(H.Asano Pascal Processing system)
  4.                  Version 0.0
  5.  
  6.                 操 作 説 明 書
  7.  
  8.              Copyright (c) H.Asano 1992
  9.  
  10. ==============================================================================
  11.  
  12.    ┌────────────  目      次  ──────────────┐
  13.    │                                 │
  14.       │    1.   はじめに                      │
  15.       │    2.   操作概要                      │
  16.       │    3.   コンパイラ                     │
  17.       │     3.1 環境変数TMP                   │
  18.       │     3.2 コンパイラコマンド                 │
  19.       │     3.3 -cオプション                   │
  20.       │     3.4 -aオプション                   │
  21.       │     3.5 -dオプション                   │
  22.       │     3.6 Pascalソース上の注釈によるコンパイラへの指示 │
  23.       │    4.   インタプリタ                    │
  24.       │     4.1 インタプリタコマンド                  │
  25.       │     4.2 -iオプション                   │
  26.       │     4.3 -tオプション                   │
  27.       │     4.4 input、outputファイルの割当       │
  28.       │     4.5 inputファイルに対する入力           │
  29.       │     4.6 input,output以外のファイルの扱い    │
  30.       │    5.   終了コードとその応用例               │
  31.       │    6.   ランタイムエラーとPascalソースの対応の取り方 │
  32.    │                                 │
  33.    └─────────────────────────────────┘
  34.  
  35.  
  36. 1.はじめに
  37.  
  38.     このドキュメントをお読みになる前に、「HAPPy総合解説書(HAPPY.DOC)」
  39.   をお読み下さい。
  40.     このドキュメントは、HAPPyの使い方全般について説明します。
  41.   なお、HAPPy Pascalの文法については、「HAPPy Pascal
  42.   文法書(LANGUAGE.DOC) 」(Version0.0 では未完成。ごめんなさい) 、エラーメッ
  43.   セージについては「エラーメッセージ説明書(ERROR.DOC)」を参照してください。
  44.  
  45.  
  46.  
  47. 2.操作概要
  48.  
  49.    HAPPyは、P─codeインタプリタ方式の処理系なので、プログラム作成
  50.   の流れは次のようになります。
  51.     (1) テキストエディタでPascalのソースファイルを作る。
  52.     (2) pcコマンド(コンパイラ) で、P-codeにコンパイルする。
  53.         エラーがあれば、テキストエディタでエラー箇所を修正し、エラーが
  54.         なくなるまでコンパイル、修正を繰り返す。
  55.     (3) piコマンド(P-codeインタプリタ)で、コンパイルしたP-
  56.         codeを実行する。
  57.  
  58.    下の図は、HAPPyが使う各ファイルの関係を示したものです。
  59.  
  60.   ★ pcコマンド
  61.                                コンパイラ
  62.        ┌────┐    ┌─────┐        ┌──────┐
  63.        │Pascal  │(入力)│PC.EXE   │-aオプション指定時│アセンブルリスト  │
  64.        │ソース  │───→│(PA.OVL) │─────→ │        │
  65.        │ファイル│    └─────┘──┐    │(標準出力)│
  66.        └────┘┌───  │      │    └──────┘
  67.              │     │(出力)  └───┐
  68.                        ↓     ↓          ↓(コンパイルエラー時) 
  69.          ┌────────┐  ┌──────────┐┌──────┐
  70.       │環境変数TMP で │ │P-codeオブジェクトファイル ││コンパイルエラ    │
  71.       │指定したディレクトリ │  │(カレントディレクトリにファイル名││  メッセージ    │
  72.       │にP-codeソース │ │  pcode.pco が      ││ (標準出力) │
  73.       │(pcode.pcs) が │  │    作られる    )   │└──────┘
  74.       │できる     │ └──────────┘
  75.          └────────┘    │
  76.       ---------------│------------------
  77.                    │
  78.   ★ piコマンド         │
  79.                    ↓(入力)
  80.       ┌────┐ (入力)┌─────┐ (出力)┌────┐
  81.       │標準入力│────→│PI.EXE  │────→│標準出力│
  82.       │(input) │     │(インタプリタ) │────→│(output)│
  83.       └────┘     └─────┘ (トレース)   └────┘
  84.      (通常はコンソール)    ↑        (通常はコンソール)
  85.                    ↓
  86.                 ┌──────┐
  87.                 │各種ファイル│
  88.                 └──────┘
  89.  
  90.  
  91.  
  92. 3.コンパイラ
  93.  
  94. 3.1 環境変数TMP
  95.  
  96.    コンパイラは、環境変数TMPに指定されたディレクトリにP-codeソースファイ
  97.   ルを作成します。
  98.    TMPに、RAMディスクやハードディスク、あるいはコンパイルしようとして
  99.   いるPascalソースのあるドライブとは違うドライブの作業用ディレクトリを
  100.   を指定すると、TMPの指定がない場合よりもコンパイル速度が上がります。
  101.     例えばHドライブがRAMディスクであれば、 MS-DOS のSET コマンドで次のよ
  102.   うに指定して下さい。
  103.        SET  TMP=H:\ 
  104.     ディレクトリ指定なので、最後は¥で終わってください。
  105.        SET TMP=H:\HAPPY 
  106.   という設定の場合、P-codeソースは、\HAPPYPCO.PCS という名前になってしまいま
  107.   す。HAPPY というディレクトリがある場合には、
  108.        SET TMP=\HAPPY\
  109.   として下さい。なお、TMPの設定は必須ではありません。設定がなければカレン
  110.   トディレクトリにP-codeソースファイルを作ります。このため、ファイルの読み書
  111.   きに多少時間がかかるので、コンパイル速度が落ちます。
  112.  
  113.  
  114. 3.2 コンパイラコマンド
  115.  
  116.     コンパイラコマンドは、「pc」です。
  117.    指定したソースファイルを読み込み、カレントディレクトリに、
  118.      P-codeオプジェクトファイル (pcode.pco)
  119.   を作ります。このファイル名は固定です。すでにファイルが存在する時は上書きし
  120.   ます。コンパイルエラーが起きた場合あるいは、-cオプションを指定した場合に
  121.   はこのオブジェクトファイルは生成されません。
  122.   ┌───────────────────────┐
  123.   │pc [オプション...]  ソースファイル名     │
  124.   └───────────────────────┘
  125.     単に、pc  とだけタイプすると、簡単な使い方の説明が出てきます。
  126.     オプションは、その名の通り、必要に応じて指定するもので、普段は省略してか
  127.   まいません。オプションを指定する時は、下表の物を空白で区切って指定します。
  128.   または、- の次にオプションに対応する英字を続けて指定します。
  129.     次の2つの指定方法は、同じ意味になります。
  130.      pc -i -d -a  CALENDER.PAS 
  131.         pc -ida CALENDER.PAS
  132.  
  133.   ┌───┬─────────────────────┐
  134.   │オプション│   意       味         │
  135.   ├───┼─────────────────────┤
  136.   │ -c   │P-codeを生成しない            │
  137.   │ -d   │デバッグ指令(検査を行うコードを生成する)│
  138.   │ -a   │アセンブルリストを標準出力に出力する   │
  139.   └───┴─────────────────────┘
  140.  
  141.    上の表では各オプションは英小文字で表現してありますが、対応する英大文字で
  142.   指定しても効果は同じです。
  143.    各オプションを重ねて指定した場合、互いに反するオプション( -cとそれ以外
  144.   )は、後に指定した方が有効になります。例えば
  145.      pc  -c -d  -a  CALENDER.PAS 
  146.   の場合は、 -cオプションが指定無効です。
  147.      pc -a  -d -c  CALENDER.PAS
  148.   の場合には、逆に、-a, -dオプションは無視されるため、P-codeオブジェクトは生
  149.   成されません。
  150.  
  151.  
  152. 3.3 -cオプション
  153.  
  154.    P-codeの生成を行いません。
  155.     はじめからコンパイルエラーがあることがわかっている場合、このオプションを
  156.   指定すると、高速にコンパイルエラーチェックが行えます。
  157.  
  158.  
  159. 3.4 -aオプション
  160.  
  161.    コンパイルされたP-codeのアセンブルリストを標準出力に出力します。
  162.   標準出力をリダイレクトしてファイルに落として、インタプリタのランタイムエラ
  163.   ーの解析に使います。解析方法は6章を参照して下さい。
  164.    Version 0.0 ではP-codeの仕様を公開していませんので、アセンブルリス
  165.   トの説明は省略します。
  166.  
  167.  
  168. 3.5 -dオプション
  169.  
  170.    部分範囲型の範囲チェック、配列の添字チェック等、プログラムの各種誤りをチ
  171.   ェックするP-codeを生成します。
  172.    プログラムのデバッグ期間中は、このオプションを指定しておくと誤りの発見が
  173.   容易になります。プログラムが完成した時には、このオプションを指定せずに再び
  174.   コンパイルしてください。
  175.    なお、このオプションの指定よりもPascalソース上に指定する{$d+ }、
  176.   {$d- }指示(3.6章参照)の方が優先します。
  177.    このオプションの指定により、インタプリタ実行時に以下の項目をチェックしま
  178.   す。
  179.     ・配列の添字チェック
  180.     ・ポインタ変数のnilチェック
  181.     ・ポインタ変数の不定チェック
  182.     ・代入文の代入可能性チェック
  183.     ・for文の制御変数の代入可能性チェック
  184.     ・値引数の代入可能性チェック
  185.     ・テキストファイル以外のreadにおける代入可能性チッック
  186.     ・テキストファイル以外のwriteにおける代入可能性チェック
  187.     ・packの添字チェック
  188.     ・unpackの添字チェック
  189.     ・unpackの転送可能性チェック
  190.     ・集合構成子の順序式値のHAPPy制限チェック
  191.  
  192.  
  193. 3.6 Pascalソース上の注釈によるコンパイラへの指示
  194.  
  195.    Pascalソース上に、コンパイラへの指示を入れることができます。指示は
  196.   注釈の形をしているので、プログラムの意味には影響しません。指示は、下表のよ
  197.   うな形で指定してください。注釈の開始の{または(*にすぐ続けて$を書き、続
  198.   けてdまたはt、そして+または-です。その後は自由です。間に空白などを置く
  199.   と、指示と見なされませんので注意して下さい。
  200.  
  201.     ┌────┬─────────────┐
  202.     │ 指示 │  動          作    │
  203.     ├────┼─────────────┤
  204.     │{$d+ }│検査コードを生成する      │
  205.     │{$d- }│検査コードを生成しない    │
  206.     │{$t+ }│ここよりトレースをとる  │
  207.      │{$t- }│ここよりトレースをやめる │
  208.     └────┴─────────────┘
  209.  
  210.    {$d+ }と{$d- }は、ペアで使います。
  211.    つまり、検査コードを生成したい場所を囲んで指定すれば、そこの範囲だけ検査
  212.   コードが生成されるので、コンパイラの-dオプションを指定した時よりも、全体
  213.   のオブジェクトサイズや実行速度の点で有利になります。なお、-dオプションが
  214.   あっても、{$d- }指示が現れた時点以降は検査コードの生成は行われません。
  215.  
  216.    {$t+ }と{$t- }も、ペアで使います。
  217.    {$t+ }が指定された場所に、仮想計算機のレジスタ内容をダンプする命令を生
  218.   成します。このため、ここよりトレースが開始されます。
  219.    {$t- }が指定された場所に、仮想計算機のレジスタ内容ダンプの中止命令を生
  220.   成します。このため、ここよりトレースが中止されます。
  221.    インタプリタ起動時に、-tオプションを指定した場合には、最初から最後まで
  222.   トレースが取られ、莫大な量になるので、部分的にトレースを取りたい場合に、こ
  223.   の指示を入れてください。なお、-tオプションの指定があっても、{$t- }が現
  224.   れた時点でトレースは中止されます。
  225.  
  226.  
  227. 4.インタプリタ
  228.  
  229. 4.1 インタプリタコマンド
  230.  
  231.    インタプリタのコマンドは「pi」です。
  232.    インタプリタは、カレントディレクトリにあるP-codeオブジェクトファイル( フ
  233.   ァイル名pcode.pco 固定) を読み込んで、それを解釈実行していきます。
  234.     以下に、起動コマンドを示します。
  235.  
  236.     ┌──────────────────────┐
  237.     │pi [-t][-i]           │
  238.     └──────────────────────┘
  239.  
  240.    オプションの指定は、通常必要ありませんので、ただ、pi とタイプすれば良
  241.   いのです。
  242.    インタプリタでは、起動パラメータの指定誤りチェックを行っていません。
  243.   オプションが指定された時のみ、その動作を受け付けます。
  244.   それ以外の指定はすべて無視します。
  245.  
  246.    オプションを下表に示します。下表では、オプションが英小文字で書かれていま
  247.   すが、対応する英大文字で指定しても同じ動作をします。
  248.  
  249.   オプションは、-に続いて各文字を連続して指定することもできます。
  250.      pi -i -t
  251.      pi  -it 
  252.     は同じ動作をします。
  253.  
  254.      ┌───┬──────────────────────────┐
  255.      │オプション│      意          味        │
  256.      ├───┼──────────────────────────┤
  257.      │-i │インタプリタのバージョン番号、実行するプログラムの情│
  258.      │   │報を表示後、プロクムを実行する           │
  259.      │   │                          │
  260.      │-t │仮想計算機の実行番地、レジスタ内容、スタック内容を │
  261.      │   │出力する(トレース動作)              │
  262.      └───┴──────────────────────────┘
  263.  
  264.  
  265. 4.2 -iオプション
  266.  
  267.    インタプリタのバージョン番号やHAPPyの説明、実行するプログラムの名前
  268.   などをコンソールに表示後に、プログラムを実行します。
  269.    実行するプログラム情報の表示内容について、簡単に説明します。
  270.     * Program name = xxxxxxx    ・・・  Pascalソースのprogram のあとに指定
  271.                                           した名前を表示します。
  272.       * Total memory = 8192 words ・・・  仮想計算機のトータルメモリ量です。
  273.       * Object size  = xxxx words ・・・  実行するプログラムのオブジェクトサ
  274.                                           イズです。(code+constant data)
  275.       * stack/heap   = xxxx words ・・・  トータルメモリからオブジェクトサイ
  276.                                           ズを引いたメモリサイズです。
  277.                                           これがスタックとヒープの容量になり
  278.                                           ます。
  279.  
  280.  
  281. 4.3 -tオプション
  282.  
  283.    仮想計算機の動作のトレース情報を、標準出力に出力します。
  284.    Version 0.0 は、仮想計算機の仕様を公開していませんので、ここでは説明しま
  285.   せん。Pascal-P4の仮想計算機とだいたい同じです。
  286.    私自身のデバッグのために作ったオプションなので、一般には使い道がないと思
  287.   います。
  288.    各種レジスタの値は、その番地の命令の実行前の内容を示しています。
  289.    なおこのオプションよりも、Pascalソース上の{$t+ }、{$t- }指示(
  290.   3.6章参照)の方が優先します。
  291.  
  292.  
  293. 4.4 input、outputファイルの割当
  294.  
  295.    inputファイルは標準入力に割り当たっています。
  296.    outputファイルは標準出力に割り当たっています。
  297.    したがって、通常はコンソールになります。
  298.    piコマンド実行時にリダイレクトを行えば、ファイルに切り換えることができ
  299.   ます。なお、input,outputファイル以外を使用する場合はそれらの実
  300.   ファイル名をコンソールから入力させるため、inputのリダイレクトを行わな
  301.   いで下さい。
  302.  
  303.  
  304. 4.5 inputファイルに対する入力
  305.  
  306.    ここでは、対話処理に欠かせないinputファイルに対する動作について説明
  307.   します。
  308.  
  309.  ★改行までが一括ストリームとなる
  310.  
  311.     コンソール入力は[CR]を押すまではMS-DOS管理下にあります。だから[CR]
  312.   を押すまでは誤った文字を修正することができるわけです。[CR]を押した時、それ
  313.   までの文字が一括してHAPPyに送られてくるのです。
  314.     program Aster(input,output);
  315.       var ch : char ;
  316.     begin
  317.       while not eoln(input) do
  318.         begin  read(input,ch) ; write(output,'*',ch) end
  319.     end.
  320.   というプログラムがあったとします。
  321.     コンソールから、
  322.      HAPPy [CR]
  323.   と入力すると、
  324.     *H*A*P*P*y
  325.   と出力されます。コンソールから 1文字入力するたびに、outputファイルに書き出
  326.   されるようにも考えられますが、前述のように[CR]を押すまではユーザプログラム
  327.   から管理が離れていますので、勘違いしないようにしてください。
  328.  
  329.   ★暗黙のreset(input)の行われる時期
  330.  
  331.    プログラム実行後、以下に示すことが初めて発生する直前に、暗黙的にinpu
  332.   tに対してresetが行われます。
  333.     ・input^の参照
  334.     ・inputに対するget,read,readln,eof,eolnの処理
  335.  
  336.     reset(input)という動作は、inputを検査モードにして、最初の文字をin
  337.   put^に入れる操作です。つまり、この時点でコンソール入力状態となります。
  338.  
  339.       program FistCharacter(input,output);
  340.       begin 
  341.         write(input^,'が最初の文字です')
  342.       end. 
  343.   というプログラムでは、一見inputから入力が行われないように見えますが、
  344.   実際は、inputからの入力が発生するわけです。
  345.  
  346.  
  347.   ★inputに対するreadlnの特別扱い
  348.  
  349.    規格では、readln(input) は次の文と等価であると定義されています。
  350.        begin
  351.          while not eoln(input) do get(input); 
  352.          get(input)    { ● このget が曲者である }
  353.        end
  354.  
  355.    日本語でいえば、「改行までを読み飛ばし、改行の次の文字を読み込む」処理と
  356.   なります。この通りに作ると、対話処理に向かなくなってしまいます。
  357.        program NG(input,output); 
  358.          var i : integer;
  359.        begin 
  360.          readln(i) ; 
  361.          writeln(i,' の2倍は',i*2,' です')
  362.        end.
  363.   というプログラムにおいて、コンソールから、
  364.       5[CR] 
  365.   と入れても、答えが出力されません。[CR]が押された時点でreadlnが次の文字を読
  366.   み込もうとするため、MS-DOS管理下に入ってしまいます。ここで、もう一度
  367.   [CR]を押すと答えが出力されることになります。
  368.           5 の2倍は   10です
  369.     この不自然をなくすために、inputに対するreadlnは規格に準拠しな
  370.   いことにしました。HAPPyでは、readln(input) は次の文と等価です。
  371.        begin
  372.          while not eoln(input) do get(input);
  373.     { get(input) }
  374.     end
  375.    本来readlnの中でやらなければならないgetの処理は、次に現れる
  376.    get,read,readln,eof,eoln 処理または、input^の参照の時に行います。こ
  377.   れで、先程のプログラムでも不自然なく処理が行えます。
  378.  
  379.   ★数字入力において数の形式に合わないものを入力した時には処理を打ち切る
  380.  
  381.    大変申し訳なく、自分でもまずいと思っていますが、readやreadlnを
  382.   使って整数や実数を読み込む場合、数の形式に従った入力を行わなかったら、そこ
  383.     で処理を打ち切ってしまいます。くれぐれも入力には注意して下さい。
  384.    操作性を考えると、打ち切らずに続行するべきですが、Version 0.0 では検討不
  385.   足のため安易な打切りにしました。将来は修正したいと思います。良い案があれば
  386.   教えて下さい。
  387.  
  388.  
  389. 4.6 input,output以外のファイルの扱い
  390.  
  391.    プログラム引数に指定したinput,output以外の外部ファイルと、そ
  392.   の実ファイル名の対応の取り方について説明します。
  393.    他の処理系では、assign手続き等でプログラム実行中に動的に実ファイル
  394.   との対応が取れるようになっているようですが、HAPPyは規格に対する拡張が
  395.   ありませんので、とりあえず、次の方法で対応しています。
  396.    実ファイル名は、piコマンド投入直後、コンソールに出力されるガイドに従っ
  397.   てコンソールより入力します。入力に当たって、最初の空白は読み飛ばされます。
  398.   ファイル名は32文字以降は無視されます。入力の最後には[CR]が必要です。
  399.    次のプログラムの例で説明します。
  400.  
  401.    program FileExample(IntegerFile,RealFile,CharFile,BooleanFile,
  402.                        SetFile,output) ;
  403.             const SetHigh = 31 ; SetLow = 0 ;
  404.       var   IntegerFile : file of integer                ;
  405.             RealFile    : file of real                   ;
  406.             CharFile    : file of char                   ;
  407.             BooleanFile : file of Boolean                ;
  408.             SetFile     : file of set of SetLow..SetHigh ;
  409.             i           : integer                        ;
  410.     begin
  411.       rewrite(IntegerFile) ; write(Integerfile, 123)     ;
  412.       rewrite(RealFile)    ; write(RealFile   , 3.14)    ;
  413.       rewrite(CharFile)    ; write(CharFile   , 'H')     ;
  414.       rewrite(BooleanFile) ; write(BooleanFile, True)    ;
  415.       rewrite(SetFile)     ; write(SetFile    , [1,2,3]) ;
  416.  
  417.       reset(IntegerFile)   ; writeln('Integer=',IntegerFile^:5) ;
  418.       reset(RealFile)      ; writeln('Real   =',RealFile^:5:2)  ;
  419.       reset(CharFile)      ; writeln('Char   =',CharFile^:5)    ;
  420.       reset(BooleanFile)   ; writeln('Boolean=',BooleanFile^)   ;
  421.       reset(SetFile)       ; write  ('Set    =');
  422.       for i:=SetLow to SetHigh do if i in Setfile^ then write(i:3) ;
  423.     end.
  424.  
  425.    コンパイル後piコマンドを起動すると、次のようになります。
  426.  
  427.     H:\>  pi 
  428.        *HAPPy:  ファイル( integerfile realfile charfile booleanfile setfile)の
  429.         実ファイル名を入力して下さい
  430.          integerfile : INTEGER    ─┐各ファイルについて、ファイル名を聞い
  431.          realfile    : REAL        │てくるのそれぞれ入力する。
  432.          charfile    : CHAR       │この例では、大文字の部分が入力した部
  433.          booleanfile : BOOLEAN     │分である。
  434.          setfile     : SET      ─┘
  435.  
  436.        *HAPPy:  プログラム(fileexample) を実行します
  437.        Integer=  123                 ─┐
  438.        Real   = 3.14          │
  439.     Char   =    H          │プログラムから出力された内容
  440.        Boolean= TRUE          │
  441.        Set    =  1  2  3       ─┘
  442.  
  443.  ★注意事項
  444.  
  445.    この方法だと具合が悪いことがあります。
  446.    コンソールからファイル名を入力せよ、ということはinputファイルから入
  447.   力せよ、と同じことなので、もし標準入力がリダイレクトされていると具合が悪い
  448.   のです。ここも規格を満たさない部分なので不満が残ってしまいます。
  449.    input以外のファイルを使う時は、標準入力をリダイレクトさせないように
  450.   して下さい。
  451.  
  452.  ★ファイル構造
  453.  
  454.     Version 0.0 では、テキストファイル以外のファイル構造について公開していま
  455.   せん。したがって、テキストファイル以外のファイルについては、HAPPyとそ
  456.   の他のシステムとの間でやりとりを行うことを考えていません。
  457.    テキストファイルは、一般のテキストエディタで作成される構造と同じです。
  458.    HAPPyで作ったテキストファイルは、規格に従って、ファイルが空の場合を
  459.   除いて必ず最後に改行マークがつきます。
  460.  
  461.  ★ファイル入出力のエラーについて
  462.  
  463.    Version 0.0 では、テキストファイルへのwrite,writeln,put に関しては障害チ
  464.   ェックを行っていません(エラーメッセージはあるが実際にはさぼっている) 。こ
  465.   のため、ディスクが満杯になってもエラーが検出されません。
  466.     その他のエラーチェックは行っております。
  467.  
  468.  
  469.  
  470. 5.終了コードとその応用例
  471.  
  472.    pcコマンド、piコマンドはMS-DOSのバッチファイル等で利用できる終
  473.   了コード(エラーレベルコード)を返します。
  474.    正常終了は、終了コードが0になります。以下に、各コマンドの終了コードを示
  475.   します。
  476.  
  477.       PC.EXE(コンパイラ)の終了コード
  478.    ┌───┬──────────────────────┐
  479.    │コード│      意     味         │
  480.    ├───┼──────────────────────┤
  481.    │ 0 │コンパイル正常               │
  482.    │ 1 │コンパイルエラーがあった          │
  483.    │ 2 │コンパイルエラー以外のエラー発生      │
  484.    │ 3 │アセンブル中にエラ発生           │
  485.    └───┴──────────────────────┘
  486.  
  487.       PI.EXE(インタプリタ)の終了コード
  488.    ┌───┬──────────────────────┐
  489.    │コード│      意     味         │
  490.    ├───┼──────────────────────┤
  491.    │ 0 │正常終了                  │
  492.    │ 1 │ランタイムエラー以外により処理打切り    │
  493.    │ 2 │ランタイムエラー発生により処理打切り    │
  494.    └───┴──────────────────────┘
  495.  
  496.    この終了コードをバッチファイルで判定すれば、効率的なプログラム開発が行え
  497.   ます。
  498.    例えばHAPPyに添付されているバッチファイルHAPPY.BAT は、
  499.       (1) コンパイラを起動する
  500.       (2) コンパイルエラーがあれば、RED2テキストエディタでエラーメッセージ
  501.           ファイルを開く
  502.       (3) RED2のタグジャンプ機能を駆使して、コンパイルエラー箇所を効率よく修
  503.           正する
  504.       (4) 修正後、再度コンパイラを起動する
  505.       (5) コンパイルエラーがなければ、インタプリタでプログラムを実行する
  506.   という一HAPPyを使った一連のプログラム開発を効率よく行うための例です。
  507.  
  508.     ┌──────────────────────────┐
  509.     │ echo off                     │
  510.     │ rem *** HAPPy.BAT ***               │
  511.     │ rem コンパイル、コンパイルエラー修正、実行を     │
  512.     │ rem 制御するバッチファイルです。         │
  513.     │ rem ここではテキストエディタにRED2を使っています。│
  514.     │ :compile                     │
  515.     │ pc %1 >e                     │
  516.     │ if errorlevel 2 goto end              │
  517.     │ if not errorlevel 1 goto run           │
  518.     │ red e                       │
  519.     │ echo  再コンパイルします             │
  520.     │ pause                       │
  521.     │ goto compile                   │
  522.     │ :run                       │
  523.     │ echo  実行を開始します                │
  524.     │ pause                       │
  525.     │ pi                        │
  526.     │ echo on                      │
  527.     │ :end                          │
  528.     └───────  HAPPY.BAT のリスト  ────────┘
  529.  
  530.  
  531.  
  532. 6.ランタイムエラーとPascalソースの対応の取り方
  533.  
  534.    P-codeインタプリタがユーザプログラムを実行中、誤り等発見するとラン
  535.   タイムエラーメッセージを出して処理を打ち切ります。
  536.    ここでは、ランタイムエラーメッセージから、Pascalソース上の場所の見
  537.   つけ方を説明します。
  538.  
  539.    例えば、次のようなプログラム(ソースファイル名=RunErr.PAS) で説明しまし
  540.   ょう。
  541.  
  542.    1:  {$d+}                        { 検査コードの生成指示 }
  543.    2:  program OutOfRange ;
  544.    3:    var i : -5..+5 ;           { -5から5 までしか値をとれない }
  545.    4:  begin
  546.    5:     i := Maxint ;              { 範囲外の値を代入しようとしている }
  547.    6:   end.
  548.  
  549.    このプログラムをコンパイルして実行すると、次のようなエラーメッセージが出
  550.   力されます。
  551.  
  552.   *** [ADDR=6] HAPPy Run-time error  R049:
  553.     -- 代入文: 右辺値(2147483647)が範囲内(-5 ~5)にない :  処理打ち切り ***
  554.  
  555.     エラーメッセージを見ればわかるように、代入文で範囲外の値を代入しようとし
  556.   たために発生した誤りです。
  557.     ここで、[ADDR=6]  という部分に着目して下さい。仮想計算機の6番地でこのエ
  558.   ラーが発生していることを表しています。番地とソースの対応を取るために、再度
  559.   アセンブルリスト出力指定でこのソースをコンパイルしなおします。
  560.     pc -a RunErr.PAS  >RunErr.ASM
  561.   上のようにタイプすると、RunErr.ASMというファイルにアセンブルリストが出来上
  562.   がります。このファイルを見てください。
  563.     ここで、ADDRが6番地のところを探し、それよりも上にある一番近いソースファ
  564.   イルの名前と行番号の入ったところをみつけます。この例で言えば、ソースファイ
  565.   ル名RunErr.pasの5行目、すなわち
  566.      i := Maxint ;
  567.     という代入文に誤りがあることがこれでわかります。
  568.    もしお使いのエディタがタグジャンプ機能を有していれば、RunErr.ASMを開き、
  569.   Pascalソースファイル(行番号)という形をしたところにカーソルをもって
  570.   いって、タグジャンプキーを押せば、誤りのあるソース上の行にカーソルをダイレ
  571.   クト移動させることができます。
  572.  
  573.    ADDR   OP   P      Q    P-code source statement
  574.   ================================================
  575.                            ; Writen by HAPPy Pascal Compiler Version 0.0
  576.                            ; Pascal source file name=RunErr.PAS
  577.                            N outofrange
  578.                            ; RunErr.PAS(4)
  579.       0:  11   0      0     mst           0
  580.       1:  12   0      3     cup   0   L   3
  581.       2:  58   0      0     stp
  582.                            L3
  583.                            ; RunErr.PAS(5)   ←────ソース上の場所
  584.       3:  13   1      8     ent   1   L   4
  585.       4:  13   2      6     ent   2   L   5
  586.       5:  66   1      9     ldci 2147483647
  587.     ●6:  26  49     11     chki  49 -5 5   ←───────┐
  588.       7:   3   0     19     sroi          7          │
  589.                            ; RunErr.PAS(6)          │
  590.       8:  14   0      0     retp          エラー発生場所(6番地)
  591.                            L4=   8
  592.                            L5=   6
  593.                            Q
  594.       9:
  595.      ~: constant data
  596.      11:
  597.  
  598.  
  599.  
  600.      ────────  以上 (OPERATE.DOC)  終わり───────
  601.